#pragma once

#include <unistd.h>
#include "data.hpp"

extern DataManager *_data;

class HotManager{
		private:
			std::string _back_dir;
			std::string _pack_dir;
			std::string _pack_suffix;
			int _hot_time;
		private:
			//非热点文件-返回真；热点文件-返回假
			bool HotJudge(const std::string &filename){
				FileUtil fu(filename);
				time_t last_atime = fu.LastATime();
				time_t cur_time = time(NULL);
				if (cur_time - last_atime > _hot_time){
					return true;
				}
				return false;
			}
		public:
			HotManager() {
				Config *config = Config::GetInstance();
				_back_dir = config->GetBackDir();
				_pack_dir = config->GetPackDir();
				_pack_suffix = config->GetPackFileSuffix();
				_hot_time = config->GetHotTime();
				FileUtil tmp1(_back_dir);
				FileUtil tmp2(_pack_dir);
				tmp1.CreateDirectory();
				tmp2.CreateDirectory();
			}
			bool RunModule() {
				while(1){
					//1. 遍历备份目录，获取所有文件名
					FileUtil fu(_back_dir);
					std::vector<std::string> arry;
					fu.ScanDirectory(&arry);
					//2. 遍历判断文件是否是非热点文件
					for (auto &a : arry) {
						if (HotJudge(a) == false){
							continue;//热点文件则不需要特别处理
						}
						//3. 获取文件的备份信息
						BackupInfo bi;
						if (_data->GetOneByRealPath(a, &bi) == false){
							//现在有一个文件存在，但是没有备份信息
							bi.NewBackupInfo(a);//设置一个新的备份信息出来
						}
						//3. 对非热点文件进行压缩处理
						FileUtil tmp(a);
						tmp.Compress(bi.pack_path);
						//4. 删除源文件，修改备份信息
						tmp.Remove();
						bi.pack_flag = true;
						_data->Update(bi);
					}
					usleep(1000);//避免空目录循环遍历，消耗cpu资源过高
				}
				return true;
			}
	};


























//class HotManager
//{
//	private:
//		std::string _pack_dir;//压缩目录
//		std::string _back_dir;//备份目录
//		std::string _pack_suffix;
//		int _hot_time;
//
//	private:
//		//判断热点文件
//		//非热点文件返回--真，热点文件返回--假
//		bool HotJudge(const std::string &filename)
//		{
//			FileUtil fu(filename);
//			time_t last_atime=fu.LastATime();
//			time_t cur_time=time(NULL);
//			if(cur_time - last_atime>_hot_time)
//			{
//				return true;
//			}
//
//			return false;
//		}
//
//	public:
//		HotManager()
//		{
//			Config *config=Config::GetInstance();
//			_back_dir=config->GetBackDir();
//			_pack_dir=config->GetPackDir();
//			_pack_suffix=config->GetPackFileSuffix();
//			_hot_time=config->GetHotTime();
//			FileUtil tmp1(_back_dir);
//			FileUtil tmp2(_pack_dir);
//			tmp1.CreateDirectory();
//			tmp2.CreateDirectory();
//		}
//
//		bool RunModule()
//		{
//			while(1)
//			{
//				//1.遍历备份目录，获取所有文件名
//				FileUtil fu(_back_dir);
//				std::vector<std::string> arry;
//				fu.ScanDirectory(&arry);
//				//2.便利判断文件是否是非热点文件
//				for(auto &a:arry)
//				{
//					if(HotJudge(a) == false)
//					{
//						continue;
//					}
//					//3.获取文件备份信息
//					BackupInfo bi;
//					if(_data->GetOneByRealPath(a,&bi) == false)
//					{
//						//文件存在但是没有备份信息
//						bi.NewBackupInfo(a);//给他设置一个新的备份信息
//					}
//
//					//4.对非热点文件进行压缩
//					FileUtil tmp(a);
//					tmp.Compress(a);
//					//5.删除源文件
//					tmp.Remove();
//					bi.pack_flag=true;
//					_data->Update(bi);
//				}
//				usleep(1000);
//			}
//
//			return true;
//		}
//			
//};
